<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <link rel="stylesheet" href="php-txt-db-api.css" type="text/css">
  <title>SQL Syntax (Einschr&auml;nkungen f&uuml;r Txt-Db-Api)</title>
</head>
    <body>
<div align="center">    
<h1 align="left"> SQL Syntax der Txt-Db-Api (Einschr&auml;nkungen)</h1>
   
<h2 align="left">&nbsp;</h2>
   
<h2 align="left">Allgemein</h2>
   
<p align="left">Die Txt-Db-Api unterst&uuml;tzt nicht den ganzen SQL-Sprachumfang,
     der unterst&uuml;tzte Umfang sollte jedoch<br>
     mit dem SQL Standard kompatibel sein.<br>
     Nachfolgend sind die Einschr&auml;nkungen bzw. die Syntax f&uuml;r SQL
Statements      was die Txt-Db-Api betrifft aufgef&uuml;hrt. <br>
     Werte in [] sind freiwillig, "..." bedeutet das beliebig viele weitere
     Elemente folgen k&ouml;nnen,<br>
     | heisst das entweder der eine ODER der andere wert genommen werden
kann.</p>
   
<p align="left"><b>Achtung: </b>Wie auch im Standard definiert, sollten <b>Werte
     f&uuml;r str (String) Felder immer in die<br>
     Anf&uuml;hrungszeichen ' ' oder " " eingeschlossen werden!</b></p>
   
<p align="left">&nbsp;</p>
   
<h2 align="left">SELECT</h2>
   
<h3 align="left">Syntax</h3>
   
<div align="left">      
<pre align="left">SELECT [DISTINCT]<br>[funktion(][tabelle.]spalte[)] [AS alias_name] [, [funktion(][tabelle].spalte[)] [AS alias_name] , ...]  <br>FROM tabelle [AS tabellen_alias] [, tabelle2 [AS tabellen_alias], ... ] <br>[WHERE spalte=wert AND|OR spalte=spalte AND|OR ...] <br>[GROUP BY spalte, ...]<br>[ORDER BY spalte [ASC | DESC] ,...] <br>[LIMIT [offset,]anzahl] [;]      <br>

</pre>
     
<h3 align="left">Unterst&uuml;tzt</h3>
     
<p>- Siehe Syntax</p>
     
<p>- Anstelle von Spaltennnamen (<font face="Courier New, Courier, mono">spalte</font>
       in der Syntax oben) k&ouml;nnen auch direkte Werte verwendet werden.<br>
       &nbsp;&nbsp;Das k&ouml;nnen entweder Zahlen oder Strings in ' ' oder
"        " sein, z.B. <font face="Courier New, Courier, mono">SELECT 1234,
'bla',        name FROM personen;</font></p>
     
<p>- Folgende Funktionen: UNIX_TIMESTAMP(), MD5(spalte), NOW(), ABS(spalte),
       LCASE(spalte), UCASE(spalte), LOWER(spalte), UPPER(spalte), EVAL(spalte
*-+/ wert|spalte.....)<br>
       - Die oben genannten Funktionen werden auch bei WHERE, GROUP BY und
ORDER        BY unterst&uuml;tzt<br>
       - Folgende gruppierenden Funktionen: MAX(spalte), MIN(spalte), COUNT(spalte),
       SUM(spalte), AVG(spalte)<br>
       - Anstelle einer spalte kann man f&uuml;r Funktionen auch direkte
Werte        als Parameter angeben, z.B. md5('bla')<br>
       <br>
       - * anstelle von Feldnamen<br>
       - tabelle.* anstelle von Feldnamen, auch Kombinationen m&ouml;glich
z.B.        SELECT personen.*, firma.Name, ort.* ...<br>
       <br>
       - Aliase f&uuml;r Tabellen </p>
     
<p>- Im WHERE Teil werden folgende Vergleichsoperatoren unterst&uuml;tzt:
       =,&gt;,&lt;,&gt;=,&lt;=, !=, &lt;&gt;, LIKE (wildcards % und _)<br>
       - Im WHERE Teil kann entweder feld=wert, wert=wert oder auch feld=feld
stehen<br>
       &nbsp;&nbsp;(um tabellen verkn&uuml;pft abzufragen, wie z.B. im Beispiel
       unten "personen.typ_id = typen.id")<br>
       &nbsp;&nbsp;"=" steht hier nur als Beispiel, f&uuml;r Feld=Feld  
     sind alle oben genannten Vergleichsoperatoren m&ouml;glich<br>
       - Im WHERE Teil k&ouml;nnen beliebige viele AND und OR verwendet werden
       <br>
       - Im WHERE Teil k&ouml;nnen beliebig viele Klammern verwendet und
verschachtelt        werden <br>
       <br>
       <br>
       - DISTINCT: nur zeilen die sich eindeutig von andern unterscheiden
werden        zur&uuml;ckgegeben<br>
       - GROUP BY: ergebniss nach den angegebenen spalten gruppieren. <br>
     </p>
     
<p>- LIMIT (nur bei SELECT): <i>offset</i> ist ein offset <b>beginnend bei
       0</b> (d.h. ein offset 1 startet bei der 2. Reihe), <br>
       &nbsp;&nbsp;welches angibt ab welcher Reihe man das Ergebnis auf <i>anzahl
       </i>Zeilen limitieren m&ouml;chte.<br>
       &nbsp;&nbsp;Wenn man ein LIMIT angibt so ist <i>anzahl </i>obligatorisch,
       das offset kann auch weggelassen werden.<br>
       &nbsp;&nbsp;Beispiel: LIMIT 4,10 (Liefert nur die Zeilen von 5 bis
und mit        14 zur&uuml;ck =&gt; Anzahl = 10)</p>
     
<p>- Bei DISTINCT und GROUP BY wird immer der erste wert genommen,<br>
       &nbsp;&nbsp;Beispiel: "SELECT time, ip FROM log GROUP BY time"</p>
     
<table width="463" border="0">
       <tbody>
    <tr>
          <td width="160">time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;ip<br>
           10348395 | 192.168.0.1<br>
           10348395 | 192.168.0.3</td>
         <td width="34">            
      <div align="center">&gt;</div>
         </td>
         <td width="255">time&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;ip<br>
           10348395 | 192.168.0.1</td>
       </tr>
     
  </tbody>
</table>
     
<p><br>
     </p>
     
<h3 align="left">Nicht unterst&uuml;tzt</h3>
     
<p>- Zusammenf&uuml;gen von Feldern wie zB <i>SELECT name &amp; " "     
  &amp; vorname AS ganzer_name</i> oder <i><br>
       &nbsp;&nbsp;SELECT name + vorname AS ganzer_name</i><br>
       - Alles was nicht irgendwie unter Syntax oder Unterst&uuml;tzt zu
finden        ist</p>
     
<h3>Beispiele</h3>
     
<p>SELECT vorname, personen.nachname, typen.typ AS personen_typ FROM personen,
       typen <br>
       WHERE personen.typ_id = typen.id AND (personen.Nr&gt;=10 OR personen.vorname='Hans')
       <br>
       ORDER BY vorname LIMIT 100</p>
     
<p>SELECT COUNT(t.name), AVG(t.alter) AS durchschnittsalter, k.name FROM
teilnehmer        AS t, kurs AS k<br>
       WHERE t.kurs_nr=kurs.id GROUP BY k.name;</p>
     
<p>SELECT md5('bla');<br>
     </p>
     
<h3>Hinweise</h3>
     
<p><b>ACHTUNG: </b>Vor und nach jedem OR oder AND m&uuml;ssen je ein Leerschlag
       (" ") stehen. <br>
       Dies damit der Parser genau zwischen AND und OR's die eventuell zu
Feldnamen        geh&ouml;ren<br>
       oder AND und OR's die als Teil der Logik gemeint sind, unterscheiden
kann        !<br>
       Das gleiche gilt f&uuml;r LIKE!</p>
     
<p> Ung&uuml;ltig: Name='Test'OR Nr&gt;20 <br>
       G&uuml;ltig: Name='Test' OR Nr&gt;20</p>
     
<p><b>ACHTUNG: </b>Benutzt LIKE nur wenn es zwingend n&ouml;tig ist, da LIKE
       viel langsamer ist als ein<br>
       normaler String-Vergleich. Wenn man also alle Datens&auml;tze Abfragen
will        wo der ort <b>genau</b> 'Basel'<br>
       ist sollte man es so machen: SELECT * FROM tabelle WHERE ort='Basel'
<br>
       und NICHT so: SELECT * FROM tabelle WHERE ort LIKE 'Basel'<br>
       und schon GAR NICHT so: SELECT * FROM tabelle WHERE ort LIKE '%Basel%'</p>
     
<p>&nbsp;</p>
     
<h2 align="left">INSERT</h2>
     
<h3 align="left">Syntax</h3>
     
<div align="left">        
<pre align="left">INSERT [INTO] tabelle [(spalte1, spalte2, spalte_n, ...)] <br>VALUES  (  [funktion(]wert[)]  [, funktion[(]wert2[)], wert_n, ...]) [;]<br>	oder<br>INSERT [INTO] tabelle <br>SET spalte= [funktion(] wert [)]  [, spalte2=[funktion(]wert2[)], spalte_n=[funktion(]wert_n[)], ...] [;]<br></pre>
       
<h3 align="left">Unterst&uuml;tzt</h3>
       
<p>- Siehe Syntax<br>
         - Folgende Funktionen: UNIX_TIMESTAMP(), MD5(wert), NOW(), ABS(wert),
         LCASE(wert), UCASE(wert), LOWER(wert), UPPER(wert) <br>
         - Als Parameter f&uuml;r die Funktionen werden hier logischerwesie
nur          Werte und keine Spalten unterst&uuml;tzt.<br>
         <br>
       </p>
       
<h3 align="left">Nicht unterst&uuml;tzt</h3>
       - INSERT mit SELECT<br>
       - Mehrere Datens&auml;tze einf&uuml;gen (in einem SQL Statement)<br>
       - Gruppierende Funktionen wie zB MAX(), MIN() etc. (was auch gar keinen
       Sinn machen w&uuml;rde!)<br>
       - Alles was nicht irgendwie unter Syntax zu finden ist       
<h3 align="left">Beispiele</h3>
       
<p>INSERT INTO personen (vorname, nachname) VALUES ('hans','meier');</p>
       
<p>INSERT INTO passwords (user, password) VALUES ( 'user1', md5('mypassword')
         );</p>
       
<p>INSERT INTO personen SET vorname=upper('hans'), alter=abs(-55), eingetragen=NOW()
         ; </p>
       
<p>&nbsp;</p>
       
<h2 align="left">DELETE</h2>
       
<h3 align="left">Syntax</h3>
       
<div align="left">          
<pre align="left">DELETE FROM tabelle [WHERE &lt;gleich wie bei SELECT&gt;] [;]<br></pre>
         
<h3 align="left"><br>
           Unterst&uuml;tzt</h3>
         
<p>- Siehe Syntax<br>
           - Das l&ouml;schen der ganzen Tabelle (kein WHERE angeben)<br>
           - F&uuml;r den WHERE Teil gilt das gleiche wie bei SELECT (funktionen
           werden also auch unterst&uuml;zt!)<br>
         </p>
         
<h3 align="left">Nicht unterst&uuml;tzt</h3>
         
<p>- LIMIT<br>
           - Alles was nicht irgendwie unter Syntax zu finden ist</p>
         
<h3>Beispiele</h3>
         
<p>DELETE FROM personen WHERE vorname='Hans';</p>
         
<p>DELETE FROM personen WHERE passwort=md5('mypw') AND abs(alter)=abs(-5);</p>
         
<p>&nbsp;</p>
         
<h2 align="left">UPDATE</h2>
         
<h3 align="left">Syntax</h3>
         
<div align="left">            
<pre align="left">UPDATE tabelle SET spalte=[funktion(]wert[)] [,spalte2=[funktion(]wert2[)], spalte_n=[funktion(]wert_n[)], ...] <br>[WHERE &lt;gleich wie bei SELECT&gt;] [;]<br></pre>
           
<h3 align="left"><br>
             Unterst&uuml;tzt</h3>
           
<p>- Siehe Syntax<br>
             - Folgende Funktionen f&uuml;r die Werte: UNIX_TIMESTAMP(),
MD5(spalte              oder wert), NOW(), ABS(spalte oder wert), <br>
             &nbsp;&nbsp;LCASE(spalte oder wert), UCASE(spalte oder wert),
LOWER(spalte              oder wert), UPPER(spalte oder wert), EVAL(spalte
*-+/ wert|spalte.....)<br>
             - Updaten der ganzen Tabelle (kein WHERE angeben)<br>
             - Zuweisen des Wertes einer Spalte an eine andere<br>
             - F&uuml;r den WHERE Teil gilt das gleiche wie bei SELECT (funktionen
             werden also auch unterst&uuml;zt!) <br>
           </p>
           
<h3 align="left">Nicht unterst&uuml;tzt</h3>
           
<p>- LIMIT<br>
             - ORDER BY<br>
             - Alles was nicht irgendwie unter Syntax zu finden ist</p>
           
<h3>Beispiele</h3>
           
<p>UPDATE personen SET vorname='Hans2000' WHERE vorname='Hans';<br>
             <br>
             UPDATE personen SET vorname=nachname WHERE vorname='Hans'; <br>
             <br>
             UPDATE personen SET passwort=md5(passwort);<br>
             <br>
             UPDATE personen SET alter=abs(-20), name=upper(name); </p>
         </div>
         
<p>&nbsp;</p>
       </div>
       
<h2 align="left"><a name="createTable"></a>CREATE TABLE</h2>
       
<h3 align="left">Syntax</h3>
       
<div align="left">          
<pre align="left">CREATE TABLE tabellen_name (spalten_name  typ [DEFAULT 'defaultWert'] [, spalten_name2  typ2 [DEFAULT 'defaultWert'], ... ]) [;]<br></pre>
         
<h3 align="left"><br>
           Unterst&uuml;tzt</h3>
         
<p>- Siehe Syntax<br>
           - DEFAULT (Den Defaultwert in ' ' setzten, auch bei Zahlen)<br>
           - Wenn f&uuml;r eine inc Spalte ein Defaultwert gesetzt wurde,
so sind            die inc Werte des ersten<br>
           &nbsp;&nbsp;Datensatzes Defaultwert+1. F&uuml;r alle weiteren
Spalten            wird der Defaultwert ignoriert.<br>
         </p>
         
<h3 align="left">Nicht unterst&uuml;tzt</h3>
         
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
           - Nur folgende Syntax (spalten_name typ , spalten_name typ , ....)
<br>
           &nbsp;&nbsp;und sonst kein einiziges Keyword (ausser DEFAULT)!!
<br>
           - SQL Standardtypen, <b>typ kann nur inc (AutoWert), int (Zahl)
oder            str (Text) sein.</b></p>
         
<h3>Beispiel</h3>
         
<p>CREATE TABLE personen (id inc, vorname str DEFAULT 'john' , nachname  
         str);</p>
         
<p>&nbsp;</p>
         
<h2 align="left">DROP TABLE</h2>
         
<h3 align="left">Syntax</h3>
         
<div align="left">            
<pre align="left">DROP TABLE tabelle1 [, tabelle2, ...][;]</pre>
           
<h3 align="left"><br>
             Unterst&uuml;tzt</h3>
           
<p>- Siehe Syntax<br>
             - 1 oder mehrere Tabellen gleichzeitig l&ouml;schen<br>
           </p>
           
<h3 align="left">Nicht unterst&uuml;tzt</h3>
           
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
           </p>
           
<h3>Beispiel</h3>
           
<p>DTOP TABLE personen;</p>
           
<p>&nbsp;</p>
         </div>
         
<h2 align="left">LIST TABLES</h2>
         
<h3 align="left">Syntax</h3>
         
<div align="left">            
<pre align="left">LIST TABLES [WHERE ...] <br>[GROUP BY spalten_name, ...]<br>[ORDER BY spalten_name [ASC | DESC] ,...] <br>[LIMIT [offset,]anzahl] [;]      </pre>
           
<h3 align="left"><br>
             Unterst&uuml;tzt</h3>
           
<p>- Siehe Syntax<br>
             - Gibt alle Tabellen einer Datenbank als ResultSet Objekt zur&uuml;ck.
             Dieses ResultSet hat eine Spalte<br>
             &nbsp;&nbsp;Namens "table" welche den Tabellennamen als    
         String enth&auml;lt<br>
             - F&uuml;r WHERE, GROUP BY, ORDER BY und LIMIT Syntax siehe
SELECT<br>
             <br>
           </p>
           
<h3 align="left">Nicht unterst&uuml;tzt</h3>
           
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
             - Funktionen</p>
           
<h3>Beispiel</h3>
           
<p>LIST TABLES;</p>
         </div>
         
<p>&nbsp;</p>
         
<h2 align="left">CREATE DATABASE</h2>
         
<h3 align="left">Syntax</h3>
         
<div align="left">            
<pre align="left">CREATE DATABASE datanbank_name [;]</pre>
           
<h3 align="left"><br>
             Unterst&uuml;tzt</h3>
           
<p>- Siehe Syntax<br>
             - Nur eine Databank kann mit einem Statement erzeugt werden.<br>
             - Dieses Statement sollte NUR auf einer ROOT_DATABASE Datanbank
ausgef&uuml;hrt              werden.<br>
             &nbsp;&nbsp;Man erh&auml;lt diese mit einem $db=new Database(ROOT_DATABASE);
             aufruf. <br>
             &nbsp;&nbsp;ROOT_DATABASE ist eine definierte Konstante.<br>
             <br>
           </p>
           
<h3 align="left">Nicht unterst&uuml;tzt</h3>
           
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
           </p>
           
<h3>Beispiel</h3>
           
<p>CREATE DATABASE meineDatenbank;</p>
         </div>
         
<p>&nbsp;</p>
         
<h2 align="left">DROP DATABASE</h2>
         
<h3 align="left">Syntax</h3>
         
<div align="left">            
<pre align="left">DROP DATABASE datanbank_name [;]</pre>
           
<h3 align="left"><br>
             Unterst&uuml;tzt</h3>
           
<p>- Siehe Syntax<br>
             - Nur eine Databank kann mit einem Statement gel&ouml;scht werden.<br>
             - Dieses Statement sollte NUR auf einer ROOT_DATABASE Datanbank
ausgef&uuml;hrt              werden.<br>
             &nbsp;&nbsp;Man erh&auml;lt diese mit einem $db=new Database(ROOT_DATABASE);
             aufruf. <br>
             &nbsp;&nbsp;ROOT_DATABASE ist eine definierte Konstante.<br>
             <br>
           </p>
           
<h3 align="left">Nicht unterst&uuml;tzt</h3>
           
<p> - Alles was nicht irgendwie unter Syntax zu finden ist !!<br>
           </p>
           
<h3>Beispiel</h3>
           
<p>DROP DATABASE meineDatenbank;</p>
         </div>
         
<p>&nbsp;</p>
         </div>
            </div>
   </div>
 </div>
 <br>
</body>
</html>
